
#ifndef __pref_change_registrar_h__
#define __pref_change_registrar_h__

#pragma once

#include <set>
#include <string>

#include "base/basic_types.h"

class PrefService;
class NotificationObserver;

// Automatically manages the registration of one or more pref change observers
// with a PrefStore. Functions much like NotificationRegistrar, but specifically
// manages observers of preference changes. When the Registrar is destroyed,
// all registered observers are automatically unregistered with the PrefStore.
class PrefChangeRegistrar
{
public:
    PrefChangeRegistrar();
    virtual ~PrefChangeRegistrar();

    // Must be called before adding or removing observers. Can be called more
    // than once as long as the value of |service| doesn't change.
    void Init(PrefService* service);

    // Adds an pref observer for the specified pref |path| and |obs| observer
    // object. All registered observers will be automatically unregistered
    // when the registrar's destructor is called unless the observer has been
    // explicitly removed by a call to Remove beforehand.
    void Add(const char* path, NotificationObserver* obs);

    // Removes a preference observer that has previously been added with a call to
    // Add.
    void Remove(const char* path, NotificationObserver* obs);

    // Removes all observers that have been previously added with a call to Add.
    void RemoveAll();

    // Returns true if no pref observers are registered.
    bool IsEmpty() const;

private:
    typedef std::pair<std::string, NotificationObserver*> ObserverRegistration;

    std::set<ObserverRegistration> observers_;
    PrefService* service_;

    DISALLOW_COPY_AND_ASSIGN(PrefChangeRegistrar);
};

#endif //__pref_change_registrar_h__